跳到主要内容

文件上传

官方SDK快速入门

依赖导入

<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>

如果使用的是Java 9及以上的版本,则需要添加JAXB相关依赖。添加JAXB相关依赖示例代码如下:

<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>

注入OSS实例

OssConfig.java
/**
* @author 追梦路上的孩子
* @version 1.0
* @date 2024/1/18 11:26
*/
@Configuration
@EnableConfigurationProperties(OssConfigProperties.class)
public class OssConfig {

@Autowired
private OssConfigProperties ossConfigProperties;

@Bean
public OSS oss() {
return new OSSClientBuilder().build(ossConfigProperties.getEndpoint(), ossConfigProperties.getAccessKeyId(), ossConfigProperties.getSecretAccessKey());
}
}
OssConfigProperties.java
/**
* @author 追梦路上的孩子
* @version 1.0
* @date 2024/1/18 11:55
*/
@Data
@ConfigurationProperties("aliyun.oss")
public class OssConfigProperties {
private String endpoint;
private String accessKeyId;
private String secretAccessKey;
private String bucketName;
private String baseUrl;
}

配置密钥和属性

application.yml
# 阿里云oss配置
aliyun:
oss:
endpoint: oss-cn-guangzhou.aliyuncs.com (填写自己的地域名)
access-key-id: LTAI5t6gQH6PR8jExxxxxxxx (填写自己的密钥id)
secret-access-key: 6wSb5TyfLe57pOAualXw5vxxxxxxxx (填写自己的密钥key)
bucket-name: oa-oss-bucket-studio-hu (填写自己的存储桶名称)
base-url: http://oss.hyqstudio.top/ (填写自己的访问域名)

编写接口

OssService.java
/**
* @author 追梦路上的孩子
* @version 1.0
* @date 2024/1/18 14:55
*/
public interface OssService {

/**
* 图片上传
* @param multipartFile 源文件
* @return url地址
*/
String uploadImage(MultipartFile multipartFile);
}

实现类

OssServiceImpl.java
/**
* @author 追梦路上的孩子
* @version 1.0
* @date 2024/1/18 14:57
*/
@Slf4j
@Service
public class OssServiceImpl implements OssService {
private static final String BASE_PATH = "images/";
@Autowired
private OSS oss;

@Autowired
private OssConfigProperties ossConfigProperties;

@Override
public String uploadImage(MultipartFile multipartFile) {
String originalFilename = multipartFile.getOriginalFilename();
assert originalFilename != null;
String key = getFilePath() + getFileName(originalFilename);
try {
//调用hutool工具类去判断是否为图片
String type = FileTypeUtil.getType(multipartFile.getInputStream(), true);
if (ObjectUtils.isEmpty(type) || !IMAGE_SUFFIX_LIST.contains(type)) {
throw new ServiceException(ResultStatus.IMAGE_TYPE_ERROR);
}
oss.putObject(ossConfigProperties.getBucketName(), key, multipartFile.getInputStream());
} catch (ServiceException ex) {
throw new ServiceException(ResultStatus.IMAGE_TYPE_ERROR);
} catch (OSSException | ClientException | IOException e) {
throw new ServiceException(ResultStatus.FILE_UPLOAD_FAILED);
}
return ossConfigProperties.getBaseUrl() + key;
}

/**
* @param oldFileName 源文件名
* @return 新的文件名
*/
private String getFileName(String oldFileName) {
return String.format("%s%s%s",
DateUtil.format(LocalDateTime.now(), "yyyyMMddHHmmss"),
RandomUtil.randomString(4),
oldFileName.substring(oldFileName.lastIndexOf(".")));
}

/**
* @return 文件存储路径
*/
private String getFilePath() {
return String.format("%s%s", BASE_PATH, DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd") + "/");
}

}